home *** CD-ROM | disk | FTP | other *** search
- # Send/receive UDP multicast packets.
- # Requires that your OS kernel supports IP multicast.
- # This is built-in on SGI, still optional for most other vendors.
- #
- # Usage:
- # mcast -s (sender)
- # mcast -b (sender, using broadcast instead multicast)
- # mcast (receivers)
-
- MYPORT = 8123
- MYGROUP = '225.0.0.250'
-
- import sys
- import time
- import struct
- import regsub
- from socket import *
-
-
- # Main program
- def main():
- flags = sys.argv[1:]
- #
- if flags:
- sender(flags[0])
- else:
- receiver()
-
-
- # Sender subroutine (only one per local area network)
- def sender(flag):
- s = socket(AF_INET, SOCK_DGRAM)
- if flag == '-b':
- s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
- mygroup = '<broadcast>'
- else:
- mygroup = MYGROUP
- ttl = struct.pack('b', 1) # Time-to-live
- s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, ttl)
- while 1:
- data = `time.time()`
- ## data = data + (1400 - len(data)) * '\0'
- s.sendto(data, (mygroup, MYPORT))
- time.sleep(1)
-
-
- # Receiver subroutine (as many as you like)
- def receiver():
- # Open and initialize the socket
- s = openmcastsock(MYGROUP, MYPORT)
- #
- # Loop, printing any data we receive
- while 1:
- data, sender = s.recvfrom(1500)
- while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's
- print sender, ':', `data`
-
-
- # Open a UDP socket, bind it to a port and select a multicast group
- def openmcastsock(group, port):
- # Import modules used only here
- import regsub
- import struct
- #
- # Create a socket
- s = socket(AF_INET, SOCK_DGRAM)
- #
- # Allow multiple copies of this program on one machine
- # (not strictly needed)
- s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
- #
- # Bind it to the port
- s.bind(('', port))
- #
- # Look up multicast group address in name server
- # (doesn't hurt if it is already in ddd.ddd.ddd.ddd format)
- group = gethostbyname(group)
- #
- # Construct binary group address
- bytes = eval(regsub.gsub('\.', ',', group))
- grpaddr = 0
- for byte in bytes: grpaddr = (grpaddr << 8) | byte
- #
- # Construct struct mreq from grpaddr and ifaddr
- ifaddr = INADDR_ANY
- mreq = struct.pack('ll', grpaddr, ifaddr)
- #
- # Add group membership
- s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
- #
- return s
-
-
- main()
-